﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///<summary>
///面板基类
///找到并储存自己面板下所有的组件对象
///提供面板显示或者隐藏的方法
///</summary>
public class BasePanel : MonoBehaviour
{
    private Dictionary<string, List<UIBehaviour>> UIComponentsDic = new Dictionary<string, List<UIBehaviour>>();
    void Awake()
    {
        FindChildrenUIComponents<Button>();
        FindChildrenUIComponents<Image>();
        FindChildrenUIComponents<Text>();
        FindChildrenUIComponents<Toggle>();
        FindChildrenUIComponents<Slider>();
        FindChildrenUIComponents<ScrollRect>();
    }
    /// <summary>
    /// 写给BasePanel子类用的方法 , 通过传入参数"组件名"可以直接获取组件对象(假如
    /// </summary>
    /// <typeparam name="T">传入要找的游戏对象的类型 , 一个名字加一个类型才能确定唯一的控件</typeparam>
    /// <param name="UIComponentName">传入要找的对象名</param>
    /// <returns></returns>
    protected T GetUIComponentByName<T>(string UIComponentName) where T: UIBehaviour 
    {
        if(UIComponentsDic.ContainsKey(UIComponentName))
        {
            for(int i =0;i< UIComponentsDic[UIComponentName].Count;i++)
            {//is运算符用来检查对象（变量）是否属于某种数据类型，如int、string、bool、double、class等。
                if (UIComponentsDic[UIComponentName][i] is T)
                    //这个字典里存着的是UIBehaviour , 返回的是T , 需要用as将父类转换为子类?
                    return UIComponentsDic[UIComponentName][i] as T;
            }
        }
            return null;
    }

    public virtual void Show()
    {

    }
    public virtual void Hide()
    {

    }
    protected virtual void OnClick(string buttonName)
    {

    }

    /// <summary>
    /// 用来查找这个游戏对象的某个类型的所有组件 , 将这些组件添加到字典中去 , 字典键是这个对象的名字 , 值是个集合 , 比如这个对象挂载着一个img组件和一个Button组件 , 那么这个集合就保存这两个对象的引用
    /// </summary>
    /// <typeparam name="T">泛型 , 找哪种UI组件就传进去 , 但是必须是继承自UIBehaviour的UI组件</typeparam>
    private void FindChildrenUIComponents<T>() where T:UIBehaviour
    {
        T[] temp = this.GetComponentsInChildren<T>();
        
        for(int i=0;i<temp.Length;i++)
        {
            string objName = temp[i].gameObject.name; //这个objName就是这个游戏对象的名字 , 
            //也就是GameObject  , 比如LoginPanel , 又比如BtnStart , 这个button既是游戏对象上的一个组件 , 又是层级面板上的一个游戏对象 , 一个普通游戏对象 , 挂载上Button组件 , 他就变成了Button游戏对象
            //如果字典里已经保存了这个游戏对象名 , 说明这个游戏对象已经有某个组件被保存了 , 所以他的名字已经是个键值了 , 那么就在他对应的集合里存入下一个值
            if (UIComponentsDic.ContainsKey(objName))
            {
                UIComponentsDic[objName].Add(temp[i]);
            }
            //如果没找到这个游戏对象对应的键 , 则建立这个键值对 , 游戏对象名对应着一个集合
            else
            {
                UIComponentsDic.Add(objName, new List<UIBehaviour>() { temp[i] } );
            }
            if(temp[i] is Button)
            {
                (temp[i] as Button).onClick.AddListener(() =>
                {
                    OnClick(objName);
                }
                    );
            }
        }
    }
  
}
